package com.bosssoft.protocol;

/**
 *  * 该类定义了一个协议，包含数据传输的基本信息和操作。
 *  * 报头包括学号、姓名、本次分片在整个文件中的位置。
 *  * 报尾为校验和，通过特定算法计算得出，用于检验数据的完整性。
 *
 * @author 戴圣燃
 */
public class Protocol {
    private int id = 20216833;
    private String username = "戴圣燃";
    private int location;
    private byte[] data;
    private int len;
    private byte checksSum = 0;
    /**
     * Protocol类的构造函数，初始化协议的基本信息。
     *
     * @param loc 本次分片在整个文件中的位置
     * @param data 数据内容
     * @param len 数据长度
     */
    public Protocol(int loc,byte[] data,int len){
        location = loc;
        this.data = data;
        this.len = len;
    }

    public int getLen() {
        return len;
    }

    public int getId() {
        return id;
    }
    public String getName() {
        return username;
    }
    public int getLocation() {
        return location;
    }
    public byte[] getData() {
        return data;
    }
    /**
     * 将整数转换为字节数组。
     *
     * @param intNum 需要转换的整数
     * @return 转换后的字节数组
     */
    public byte[] intToByte(int intNum) {
        return getBytes(intNum);
    }

    public static byte[] getBytes(int intNum) {
        byte[] byteNum = new byte[4];
        byteNum[3] = (byte)((intNum>>24) & 0xFF);
        byteNum[2] = (byte)((intNum>>16) & 0xFF);
        byteNum[1] = (byte)((intNum>>8) & 0xFF);
        byteNum[0] = (byte)(intNum & 0xFF);
        return byteNum;
    }
    /**
     * 获取包含完整报头、报文数据和校验和的传输数据。
     *
     * @return 包含完整信息的字节数组
     */
    public byte[] getContentData() {

        byte checksum = getCheckSum();
        byte[] transferData = getData();
        for(int i = 0;i<getLen();i++) {
            checksum = (byte)((checksum+ transferData[i])%256);
        }
        byte[] name =  getName().getBytes();
        for(int i = 0;i<6;i++) {
            checksum = (byte)((checksum+name[i])%256);
        }
        byte[] id1 =  intToByte(getId());
        for(int i = 0;i<4;i++) {
            checksum = (byte)((checksum+ id1[i])%256);
        }
        byte [] fileLocation = intToByte(getLocation());
        for(int i = 0;i<4;i++) {
            checksum = (byte)((checksum+ fileLocation[i])%256);
        }

        byte[] checksum2 = new byte[1];
        checksum2[0] = checksum;

        byte[] all = new byte[15+getLen()];
        System.arraycopy(id1, 0, all, 0, 4);
        System.arraycopy(name, 0, all, 4, name.length);
        System.arraycopy(fileLocation, 0, all, name.length+4, 4);
        System.arraycopy(transferData, 0, all, name.length+8, getLen());
        System.arraycopy(checksum2, 0, all, name.length+getLen()+8, 1);
        return all;

    }
    public byte getCheckSum() {
        return checksSum;
    }

}
